package com.streamax.s17.mqs.business.dao.util;
 
import java.util.Map;

import com.streamax.s17.mqs.business.common.MqsBusinessException;
import com.streamax.s17.mqs.business.config.InfluxDBConfig;
import org.influxdb.InfluxDB;
import org.influxdb.InfluxDBFactory;
import org.influxdb.dto.Point;
import org.influxdb.dto.Point.Builder;
import org.influxdb.dto.Query;
import org.influxdb.dto.QueryResult;

/**
 * 时序数据库 InfluxDB 连接
 * @author lw
 *
 */
public class InfluxDBConnect {
	
	private String username;//用户名
	private String password;//密码
	private String openurl;//连接地址
	private String database;//数据库
	private Integer retentionDays; //保留天数
	
	private InfluxDB influxDB;
	
	
	public InfluxDBConnect(String username, String password, String openurl, String database){
		this.username = username;
		this.password = password;
		this.openurl = openurl;
		this.database = database;
	}

	public InfluxDBConnect(InfluxDBConfig config){
		this.username = config.getUsername();
		this.password = config.getPassword();
		this.openurl = config.getUrl();
		this.database = config.getDatabase();
	}

	/**连接时序数据库；获得InfluxDB**/
	public InfluxDB  influxDbBuild(){
		if(influxDB == null){
			influxDB = InfluxDBFactory.connect(openurl, username, password);
			influxDB.createDatabase(database);
			
		}
		return influxDB;
	}
	/**
	 * 设置数据保存策略
	 * defalut 策略名 /database 数据库名/ retentionDays 数据保存时限30天/ 1  副本个数为1/ 结尾DEFAULT 表示 设为默认的策略
	 */
	public void createRetentionPolicy(){
		String command = String.format("CREATE RETENTION POLICY \"%s\" ON \"%s\" DURATION %s REPLICATION %s DEFAULT",
				"default_policy", database, "10d", 3);
		this.query(command);
	}
	
	/**
	 * 查询
	 * @param command 查询语句
	 * @return
	 */
	public QueryResult query(String command){
		try {
			return influxDB.query(new Query(command, database));
		}catch (Exception e){
			throw new MqsBusinessException("查询失败：" , e.getMessage());
		}
	}
	
	/**
	 * 插入
	 * @param measurement 表
	 * @param tags 标签
	 * @param fields 字段
	 */
	public void insert(String measurement, Map<String, String> tags, Map<String, Object> fields){
		Builder builder = Point.measurement(measurement);
		builder.tag(tags);
		builder.fields(fields);
		
		influxDB.write(database, "", builder.build());
	}
	
	/**
	 * 删除
	 * @param command 删除语句
	 * @return 返回错误信息
	 */
	public String deleteMeasurementData(String command){
		QueryResult result = influxDB.query(new Query(command, database));
		return result.getError();
	}
	
	/**
	 * 创建数据库
	 * @param dbName
	 */
	public void createDB(String dbName){
		influxDB.createDatabase(dbName);
	}
	
	/**
	 * 删除数据库
	 * @param dbName
	 */
	public void deleteDB(String dbName){
		influxDB.deleteDatabase(dbName);
	}
	
	public String getUsername() {
		return username;
	}
 
	public void setUsername(String username) {
		this.username = username;
	}
 
	public String getPassword() {
		return password;
	}
 
	public void setPassword(String password) {
		this.password = password;
	}
 
	public String getOpenurl() {
		return openurl;
	}
 
	public void setOpenurl(String openurl) {
		this.openurl = openurl;
	}
 
	public void setDatabase(String database) {
		this.database = database;
	}
}